require "ISBaseObject"

ISReloadable = ISBaseObject:derive("ISReloadable");

--************************************************************************--
--** ISReloadable:initialise
--**
--************************************************************************--
function ISReloadable:initialise()

end

--************************************************************************--
--** ISReloadable:new
--**
--************************************************************************--
function ISReloadable:new()
	local o = {}
	setmetatable(o, self)
    self.__index = self
   return o
end

--************************************************************************--
--** ISReloadable:isLoaded
--**
--** Returns whether or not the gun will fire when the mouse is next
--** clicked
--**
--************************************************************************--
function ISReloadable:isLoaded()
	return false;
end

--************************************************************************--
--** ISReloadable:fireShot
--**
--** Action performed when a shot is fired. Should typically decrease
--** the current amount of ammo in the weapon
--**
--************************************************************************--
function ISReloadable:fireShot()
	-- do nothing
end

--************************************************************************--
--** ISReloadable:canReload
--**
--** Whether the character attempting to reload has the necessary
--** prerequisites to perform the reload action. Called prior to
--** the timed action and not to be confused with isReloadValid
--**
--************************************************************************--
function ISReloadable:canReload(chr)
	return true;
end

--************************************************************************--
--** ISReloadable:isReloadValid
--**
--** Function for the TimedAction that determines whether the reload
--** action is still valid. If the player does something that should
--** interrupt the action, this should return false
--**
--** @param char - the character performing the action. Must not be nil
--** @param square - not used
--** @param difficulty - the difficulty level
--**
--** @return true if the action may continue to be performed
--**
--************************************************************************--
function ISReloadable:isReloadValid(char, square, difficulty)
	return true;
end

--************************************************************************--
--** ISReloadable:reloadStart
--**
--** Function that should be performed upon the start of the timed action
--** Considers the difficulty and performs the corresponding difficulty
--** reload action
--**
--** @param char - the character performing the action. Must not be nil
--** @param square - not used
--** @param difficulty - the difficulty level
--**
--************************************************************************--
function ISReloadable:reloadStart(char, square, difficulty)

end


--************************************************************************--
--** ISReloadable:reloadPerform
--**
--** Function that should be performed upon successful completion of the
--** timed action. Considers the difficulty and performs the corresponding
--** reload action
--**
--** @param char - the character performing the action. Must not be nil
--** @param square - not used
--** @param difficulty - the difficulty level
--**
--************************************************************************--
function ISReloadable:reloadPerform(char, square, difficulty)
	return false;
end

--************************************************************************--
--** ISReloadable:getReloadText
--**
--** Returns the string that should be displayed in the UI reload option
--**
--** @return - the string that should be displayed
--**
--************************************************************************--
function ISReloadable:getReloadText()
	return getText('ContextMenu_Reload');
end

--************************************************************************--
--** ISReloadableWeapon:isChainReloading
--**
--** Returns true if a reload action should be performed immediately after
--** this one. Does not take into account ammunition availability
--**
--************************************************************************--
function ISReloadable:isChainReloading()
	return true;
end

--************************************************************************--
--** ISReloadable:getReloadTime
--**
--** Returns the time take to perform a single reload action
--**
--************************************************************************--
function ISReloadable:getReloadTime()
	return self.reloadTime;
end

--************************************************************************--
--** ISReloadable:canRack
--************************************************************************--
function ISReloadable:canRack(chr)
	return false;
end

local soundToGameSound = {
	bulletInRifle = 'BulletInRifle',
	bulletOutVarmint = 'BulletOutVarmint',
	stormyRevolverInsertRound = 'StormyRevolverInsertRound',
	pumpaction = 'ShotgunPumpAction',
	stormyShotgunClick = 'StormyShotgunClick',
	stormyRevolverInsertRound = 'StormyShotgunInsertRound',
	stormy9mmClick = 'Stormy9mmClick',
	stormy9mmClipEject = 'Stormy9mmClipEject',
	stormy9mmRack = 'Stormy9mmRack',
	stormy9mmClipLoad = 'Stormy9mmClipLoad',
}

--************************************************************************--
--** ISReloadable:syncItemToReloadable
--**
--** Function that copies details from an Item's modData to the instance
--** of this ISReloadableWeapon
--**
--** @param item - the item from which the reloadable information
--** should be retrieved
--**
--************************************************************************--
function ISReloadable:syncItemToReloadable(item)
	local modData = item:getModData();
	if(modData.reloadClass ~= nil) then
		-- Compatibility: convert old sound names to GameSound names
		for k,v in pairs(modData) do
			if soundToGameSound[v] then
				modData[k] = soundToGameSound[v]
			end
		end
		self.type = modData.type or item:getType();
		self.moduleName = modData.moduleName
		if(self.moduleName == nil) then
			self.moduleName = 'Base'
		end
		self.reloadClass = modData.reloadClass;
		self.ammoType = modData.ammoType;
		self.loadStyle = modData.reloadStyle;
		self.ejectSound = modData.ejectSound;
		self.clickSound = modData.clickSound;
		self.insertSound = modData.insertSound;
		self.rackSound = modData.rackSound;
		self.maxCapacity = modData.maxCapacity or item:getClipSize();
		self.reloadTime = modData.reloadTime or item:getReloadTime();
		self.rackTime = modData.rackTime;
		self.currentCapacity = modData.currentCapacity;
--		self.reloadText = modData.reloadText;
	end
end

--************************************************************************--
--** ISReloadable:syncReloadableToItem
--**
--** Function that copies details from the instance of this
--** ISReloadable to an Item's modData
--**
--** @param item - the item to which the reloadable information
--** should be copied
--**
--************************************************************************--
function ISReloadable:syncReloadableToItem(item)
	local modData = item:getModData();
	modData.type = self.type;
	modData.currentCapacity = self.currentCapacity;
end

--************************************************************************--
--** ISReloadable:setupReloadable
--**
--** Function that initialises all the required modData on an item.
--**
--** @param weapon - the weapon to setup
--** @param v - the lua table containing the key value pairs to attach
--** to the modData
--************************************************************************--
function ISReloadable:setupReloadable(item, v)
	local modData = item:getModData();
	modData.type = v.type;
	modData.moduleName = v.moduleName;
	modData.reloadClass = v.reloadClass;
	modData.ammoType = v.ammoType;
	modData.loadStyle = v.reloadStyle;
	modData.ejectSound = v.ejectSound;
	modData.clickSound = v.clickSound;
	modData.insertSound = v.insertSound;
	modData.rackSound = v.rackSound;
	modData.maxCapacity = v.maxCapacity or item:getClipSize();
	modData.reloadTime = v.reloadTime or item:getReloadTime();
	modData.rackTime = v.rackTime;
	modData.currentCapacity = 0;
--	modData.reloadText = v.reloadText;
end

function ISReloadable:printItemDetails(item)
    print('***************************************************************');
    print('Weapon state:');
    print('***************************************************************');
    local modData = item:getModData();
    local outString  = '';
        if(modData.type ~= nil) then
            outString = outString..', type: '..modData.type;
        else
            outString = outString..', type == nil';
        end
        if(modData.reloadClass ~= nil) then
            outString = outString..', reloadClass: '..modData.reloadClass;
        else
            outString = outString..', reloadClass == nil';
        end
		if(modData.ammoType ~= nil) then
            outString = outString..', ammoType: '..modData.ammoType;
        else
            outString = outString..', ammoType == nil';
        end
        if(modData.loadStyle ~= nil) then
            outString = outString..', loadStyle: '..modData.loadStyle;
        else
            outString = outString..', loadStyle == nil';
        end
        if(modData.ejectSound ~= nil) then
            outString = outString..', ejectSound: '..modData.ejectSound;
        else
            outString = outString..', ejectSound == nil';
        end
		if(modData.clickSound ~= nil) then
            outString = outString..', clickSound: '..modData.clickSound;
        else
            outString = outString..', clickSound == nil';
        end
        if(modData.insertSound ~= nil) then
            outString = outString..', insertSound: '..modData.insertSound;
        else
            outString = outString..', insertSound == nil';
        end
        if(modData.rackSound ~= nil) then
            outString = outString..', rackSound: '..modData.rackSound;
        else
            outString = outString..', rackSound == nil';
        end
        if(modData.maxCapacity ~= nil) then
            outString = outString..', maxCapacity: '..modData.maxCapacity;
        else
            outString = outString..', maxCapacity == nil';
        end
        if(modData.reloadTime ~= nil) then
            outString = outString..', reloadTime: '..modData.reloadTime;
        else
            outString = outString..', reloadTime == nil';
        end
        if(modData.rackTime ~= nil) then
            outString = outString..', rackTime: '..modData.rackTime;
        else
            outString = outString..', rackTime == nil';
        end
        if(modData.currentCapacity ~= nil) then
            outString = outString..', currentCapacity: '..modData.currentCapacity;
        else
            outString = outString..', currentCapacity == nil';
        end
        if(modData.reloadText ~= nil) then
            outString = outString..', reloadText: '..modData.reloadText;
        else
            outString = outString..', reloadText == nil';
        end
        print(outString);
end

function ISReloadable:printReloadableDetails()
print('***************************************************************');
    print('Reloadable state');
    print('***************************************************************');
        local outString  = '';
        if(self.type ~= nil) then
            outString = outString..', type: '..self.type;
        else
            outString = outString..', type == nil';
        end
        if(self.reloadClass ~= nil) then
            outString = outString..', reloadClass: '..self.reloadClass;
        else
            outString = outString..', reloadClass == nil';
        end
		if(self.ammoType ~= nil) then
            outString = outString..', ammoType: '..self.ammoType;
        else
            outString = outString..', ammoType == nil';
        end
        if(self.loadStyle ~= nil) then
            outString = outString..', loadStyle: '..self.loadStyle;
        else
            outString = outString..', loadStyle == nil';
        end
        if(self.ejectSound ~= nil) then
            outString = outString..', ejectSound: '..self.ejectSound;
        else
            outString = outString..', ejectSound == nil';
        end
		if(self.clickSound ~= nil) then
            outString = outString..', clickSound: '..self.clickSound;
        else
            outString = outString..', clickSound == nil';
        end
        if(self.insertSound ~= nil) then
            outString = outString..', insertSound: '..self.insertSound;
        else
            outString = outString..', insertSound == nil';
        end
        if(self.rackSound ~= nil) then
            outString = outString..', rackSound: '..self.rackSound;
        else
            outString = outString..', rackSound == nil';
        end
        if(self.maxCapacity ~= nil) then
            outString = outString..', maxCapacity: '..self.maxCapacity;
        else
            outString = outString..', maxCapacity == nil';
        end
        if(self.reloadTime ~= nil) then
            outString = outString..', reloadTime: '..self.reloadTime;
        else
            outString = outString..', reloadTime == nil';
        end
        if(self.rackTime ~= nil) then
            outString = outString..', rackTime: '..self.rackTime;
        else
            outString = outString..', rackTime == nil';
        end
        if(self.currentCapacity ~= nil) then
            outString = outString..', currentCapacity: '..self.currentCapacity;
        else
            outString = outString..', currentCapacity == nil';
        end
        if(self.reloadText ~= nil) then
            outString = outString..', reloadText: '..self.reloadText;
        else
            outString = outString..', reloadText == nil';
        end
        print(outString);
end
